// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// VMOptions=--optimization-counter-threshold=100 --no-use-osr --no-background-compilation

class C<
  T0,
  T1,
  T2,
  T3,
  T4,
  T5,
  T6,
  T7,
  T8,
  T9,
  T10,
  T11,
  T12,
  T13,
  T14,
  T15,
  T16,
  T17,
  T18,
  T19,
  T20,
  T21,
  T22,
  T23,
  T24,
  T25,
  T26,
  T27,
  T28,
  T29,
  T30,
  T31,
  T32,
  T33,
  T34,
  T35,
  T36,
  T37,
  T38,
  T39,
  T40,
  T41,
  T42,
  T43,
  T44,
  T45,
  T46,
  T47,
  T48,
  T49,
  T50,
  T51,
  T52,
  T53,
  T54,
  T55,
  T56,
  T57,
  T58,
  T59,
  T60,
  T61,
  T62,
  T63,
  T64,
  T65,
  T66,
  T67,
  T68,
  T69,
  T70,
  T71,
  T72,
  T73,
  T74,
  T75,
  T76,
  T77,
  T78,
  T79,
  T80,
  T81,
  T82,
  T83,
  T84,
  T85,
  T86,
  T87,
  T88,
  T89,
  T90,
  T91,
  T92,
  T93,
  T94,
  T95,
  T96,
  T97,
  T98,
  T99,
  T100,
  T101,
  T102,
  T103,
  T104,
  T105,
  T106,
  T107,
  T108,
  T109,
  T110,
  T111,
  T112,
  T113,
  T114,
  T115,
  T116,
  T117,
  T118,
  T119,
  T120,
  T121,
  T122,
  T123,
  T124,
  T125,
  T126,
  T127,
  T128,
  T129,
  T130,
  T131,
  T132,
  T133,
  T134,
  T135,
  T136,
  T137,
  T138,
  T139,
  T140,
  T141,
  T142,
  T143,
  T144,
  T145,
  T146,
  T147,
  T148,
  T149,
  T150,
  T151,
  T152,
  T153,
  T154,
  T155,
  T156,
  T157,
  T158,
  T159,
  T160,
  T161,
  T162,
  T163,
  T164,
  T165,
  T166,
  T167,
  T168,
  T169,
  T170,
  T171,
  T172,
  T173,
  T174,
  T175,
  T176,
  T177,
  T178,
  T179,
  T180,
  T181,
  T182,
  T183,
  T184,
  T185,
  T186,
  T187,
  T188,
  T189,
  T190,
  T191,
  T192,
  T193,
  T194,
  T195,
  T196,
  T197,
  T198,
  T199,
  T200,
  T201,
  T202,
  T203,
  T204,
  T205,
  T206,
  T207,
  T208,
  T209,
  T210,
  T211,
  T212,
  T213,
  T214,
  T215,
  T216,
  T217,
  T218,
  T219,
  T220,
  T221,
  T222,
  T223,
  T224,
  T225,
  T226,
  T227,
  T228,
  T229,
  T230,
  T231,
  T232,
  T233,
  T234,
  T235,
  T236,
  T237,
  T238,
  T239,
  T240,
  T241,
  T242,
  T243,
  T244,
  T245,
  T246,
  T247,
  T248,
  T249,
  T250,
  T251,
  T252,
  T253,
  T254,
  T255,
  T256
> {
  @pragma("vm:never-inline")
  static create<T>() {
    return new C<
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      double,
      T
    >();
  }

  @pragma("vm:never-inline")
  @pragma("vm:entry-point") // Stop TFA
  @pragma("dart2js:noInline")
  dynamic checkIs(dynamic x) => x is T256;

  @pragma("vm:never-inline")
  @pragma("vm:entry-point") // Stop TFA
  @pragma("dart2js:noInline")
  dynamic checkAs(dynamic x) => x as T256;

  @pragma("vm:never-inline")
  @pragma("vm:entry-point") // Stop TFA
  @pragma("dart2js:noInline")
  dynamic checkInstantiate() => new G<G<T256>>();
}

class G<T> {}

main() {
  for (var i = 0; i < 101; i++) {
    var c1 = C.create<int>();
    if (c1.checkIs(42) != true) throw "Wrong is";
    if (c1.checkAs(42) != 42) throw "Wrong as";
    if (c1.checkInstantiate() is! G<G<int>>) throw "Wrong instantiate";

    var c2 = C.create<double>();
    if (c2.checkIs(42.0) != true) throw "Wrong is";
    if (c2.checkAs(42.0) != 42.0) throw "Wrong as";
    if (c2.checkInstantiate() is! G<G<double>>) throw "Wrong instantiate";

    var c3 = C.create<String>();
    if (c3.checkIs("42") != true) throw "Wrong is";
    if (c3.checkAs("42") != "42") throw "Wrong as";
    if (c3.checkInstantiate() is! G<G<String>>) throw "Wrong instantiate";
  }
}
